Virtual machines are ever increasing in their popularity. These virtual systems are used by many different entities for many different purposes, and there are many competing implementations. Typically, virtual machines execute on shared hardware. When multiple virtual machines are deployed on shared hardware, the shared hardware is manually assigned to each of the virtual machines in advance. As the size and complexity of the underlying shared hardware increases, the difficulty of manually assigning system resources to virtual machines increases greatly.